/**
 * @file VersionTest.cpp
 * @author Pierre Le Bodic
 * @date Mardi 27 décembre 2011
 */
#include "gtest.h"
#include "Version.h"
#include "SystemeDeVersionnage.h"
#include "VersionnageALaGNU.h"
#include "ExceptionDeVersion.h"


namespace gestionnaireDeVersions {

class VersionTest : public testing::Test{
protected:

   Version *vInit;//version valide initialisée à la construction
   Version *vDefaut;//version non initialisée
   Version *vTest;//une version non instanciée au départ
   string chaineValide;
   string chaineNonValide;
   SystemeDeVersionnage *systeme;
   
   //procédure appellée avant chaque test.
   //peut être utilisée pour initialiser des instances utilisées
   //lors de plusieurs tests
  virtual void SetUp() {
     systeme = & VersionnageALaGNU::getInstance();
     chaineValide="1.0.0";
     chaineNonValide=":(";
     ASSERT_NO_THROW(vInit=new Version(systeme,chaineValide));
     vDefaut=new Version();
     vTest=NULL;
  }
  
   virtual void TearDown() {
      delete vInit;
      delete vDefaut;
      delete vTest;
  }
};

TEST_F(VersionTest, TestDeMiseEnPlace) {
   ASSERT_TRUE(systeme->estValide(chaineValide));
   ASSERT_FALSE(systeme->estValide(chaineNonValide));
}

//tests de Version()
TEST_F(VersionTest, Version) {
   //On vérifie le constructeur par défaut
   ASSERT_FALSE(vDefaut->aUneChaineVersion());
   ASSERT_FALSE(vDefaut->aUnSystemeDeVersionnage());
   
   //On vérifie le constructeur non défaut
   ASSERT_TRUE(vInit->aUneChaineVersion());
   ASSERT_TRUE(vInit->aUnSystemeDeVersionnage());
   
   ASSERT_EQ(vInit->getSystemeDeVersionnage(),systeme);
   ASSERT_EQ(vInit->getChaineVersion(),chaineValide);
   
   //On vérifie que le constructeur non défaut jette bien une exception
   //lorsque le couple versionnage/version n'est pas valide.
   ASSERT_FALSE(systeme->estValide(chaineNonValide));
   ASSERT_THROW(vTest=new Version(systeme,chaineNonValide),ExceptionDeVersion);
   ASSERT_TRUE(vTest==NULL);
   
}

TEST_F(VersionTest, setSystemeDeVersionnage) {
   //à compléter
}

TEST_F(VersionTest, setChaineVersion) {
   //à compléter
}

TEST_F(VersionTest, aUnSystemeDeVersionnage) {
   //à compléter
}

TEST_F(VersionTest, aUneChaineVersion) {
   //à compléter
}

TEST_F(VersionTest, getSystemeDeVersionnage) {
   //à compléter
}

TEST_F(VersionTest, getChaineVersion) {
   //à compléter
}
}//namespace
